package com.youlu.campus.activity.service;

import com.youlu.campus.entity.ActivityTaskInfo;
import com.youlu.campus.entity.UserPO;
import com.youlu.campus.entity.VO.res.ActivityRankingPointsVO;
import com.youlu.campus.entity.enums.TaskBizType;
import com.youlu.campus.service.ranking.entity.UserActivityTaskRanking;
import com.youlu.campus.service.ranking.entity.UserActivityTaskRankingQueryVo;
import org.springframework.data.domain.Page;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

/**
 * 用户 参见活动的 贡献值榜单
 *
 * @Description: UserActivityTaskRankingService
 * @Date 2025/8/1
 * @module UserActivityTaskRankingService
 * @author: su
 */
public interface UserActivityTaskRankingService {

    /**
     * 根据活动id 查询用户参加活动的贡献值榜单
     *
     * @param activityId
     * @return
     */
    List<UserActivityTaskRanking> findByActivityId(String activityId);

    /**
     * 新增
     *
     * @param userActivityTaskRanking
     * @return
     */
    UserActivityTaskRanking save(UserActivityTaskRanking userActivityTaskRanking);

    /**
     * 修改用户信息
     */
    void updateUser(String activityId);

    /**
     * 根据用户id与活动id  新增 用户参加活动的贡献值榜单 的贡献值
     * <p>
     * **邀请活动使用**
     *
     * @param invitedByUser 邀请人
     * @param taskInfo      活动任务详情
     * @param invitedToUser 被邀请人
     * @return
     */
    UserActivityTaskRanking saveQuantityByInvited(UserPO invitedByUser, ActivityTaskInfo taskInfo, UserPO invitedToUser);

    /**
     * 根据用户id与活动id  新增 用户参加活动的贡献值榜单 的贡献值
     *
     * @param userPO      用户详情
     * @param taskInfo    活动任务详情
     * @param taskBizType 贡献值记录类型
     * @return
     */
    UserActivityTaskRanking saveQuantity(UserPO userPO, ActivityTaskInfo taskInfo, TaskBizType taskBizType);


    /**
     * 根据用户id与活动id 添加贡献值
     *
     * @param userId
     * @param activityId
     * @param quantity
     * @param taskBizType
     * @return
     */
    public Boolean addQuantityByUserIdAndActivityId(String userId, String activityId, Double quantity, TaskBizType taskBizType);

    /**
     * 根据用户id与活动id 查询用户参加活动的贡献值榜单
     *
     * @param userId
     * @param activityId
     * @return
     */
    UserActivityTaskRanking findByUserIdAndActivityId(String userId, String activityId);

    /**
     * 根据用户id 与活动id 删除用户参加活动的贡献值榜单
     *
     * @param userId
     * @param activityId
     */
    Long deleteByUserIdAndActivityId(String userId, String activityId);

    /**
     * 根据用户id与活动id  获取用户参加活动的贡献值
     *
     * @param userId
     * @param activityId
     * @return
     */
    Double getQuantity(String userId, String activityId);


    /**
     * 分页查询
     *
     * @param queryVo
     * @return
     */
    Page<ActivityRankingPointsVO> findByPage(UserActivityTaskRankingQueryVo queryVo);

    /**
     * 根据查询条件 获取数量
     *
     * @param query
     * @return
     */
    Long count(Query query);

    /**
     * 根据活动id 与任务id  统计
     *
     * @param activityId
     * @param taskId
     * @return
     */
    Long countByActivityIdAndTaskId(String activityId, String taskId);


    /**
     * 根据查询条件 获取列表
     *
     * @param query
     * @return
     */
    List<UserActivityTaskRanking> find(Query query);

    /**
     * 根据活动id 与任务id 获取用户任务总榜单
     *
     * @param activityId
     * @param taskId
     * @return
     */
    List<UserActivityTaskRanking> findByActivityIdAndTaskId(String activityId, String taskId);

    /**
     * 根据活动id 与任务id 与用户id 获取用户任务总榜单
     *
     * @param activityId
     * @param taskId
     * @param userId
     * @return
     */
    UserActivityTaskRanking findByActivityIdAndTaskIdAndUserId(String activityId, String taskId, String userId);

    /**
     * 根据活动id 与任务id 与用户id集合 获取用户任务总榜单
     *
     * @param activityId
     * @param taskId
     * @param uids
     * @return
     */
    List<UserActivityTaskRanking> findByActivityIdAndTaskIdAndUserIdIn(String activityId, String taskId, List<String> uids);

    /**
     * 新增用户任务总榜单
     *
     * @param userActivityTaskRanking
     */
    UserActivityTaskRanking insert(UserActivityTaskRanking userActivityTaskRanking);

    /**
     * 更新贡献值 根据活动id与任务id 与用户id
     *
     * @param activityId
     * @param taskId
     * @param userId
     */
    void updateQuantityByActivityIdAndTaskIdAndUserId(String activityId, String taskId, String userId, Double quantity);

    /**
     * 根据id 更新
     *
     * @param update
     */
    void updateById(UserActivityTaskRanking update);


    /**
     * 查询并修改
     *
     * @param query
     * @param update
     * @return
     */
    UserActivityTaskRanking findAndModify(Query query, Update update);

    List<UserActivityTaskRanking> getListFromDb(Query query, String activityId, Integer page, Integer pageSIze);

    /**
     * 根据用户id 修改相关信息
     *
     * @param update
     * @return
     */
    long updateByUserId(UserActivityTaskRanking update);

    /**
     * 根据用户id 获取用户任务总榜单
     *
     * @param userId
     * @return
     */
    List<UserActivityTaskRanking> findByUserId(String userId);
}
